#include <queue>
#include <thread>
#include <chrono>
#include <iostream>

////////////////////////////////////////
// 本例子将会实现一个简单的生产-消费者模式
// productor_main_loop 每隔50ms将会产生一个数字并放入到buffer中
// consumer_main_loop 每隔70ms从buffer中取一个个数字

//公共区域
std::queue<int> buffer;

void productor_main_loop(){
    for(int i = 0; i < 100; i++){
        static int counter = 0;
        buffer.push(counter++);
        //等待50ms再产生数据
        std::this_thread::sleep_for(std::chrono::milliseconds(50));
    }
}

void consumer_main_loop(){
    for(int i = 0; i < 100; i++){
        if(!buffer.empty()){
            int value = buffer.front();
            buffer.pop();
            std::cout << "get value :: " << value << std::endl;
            //等待70ms再获取数据
            // 消费者线程的等待是必要的，尤其是在生产者没有产生数据的情况下
            // 如果消费者线程不等待，将会强行高频的去请求数据
            std::this_thread::sleep_for(std::chrono::milliseconds(70));
        }
    }
}

int main(){
    //启动生产者线程和消费者线程
    std::thread thread_productor(productor_main_loop);
    std::thread thread_consumer(consumer_main_loop);

    //等待生产者和消费者线程结束
    thread_productor.join();
    thread_consumer.join();
}
